(function () {
    var utils = UM.utils,
        browser = UM.browser,
        Base = {
            checkURL: function (url) {
                if (!url) return false;
                url = utils.trim(url);
                if (url.length <= 0) {
                    return false;
                }
                if (url.search(/http:\/\/|https:\/\//) !== 0) {
                    url += "http://";
                }

                url = url.replace(/\?[\s\S]*$/, "");

                if (!/(.gif|.jpg|.jpeg|.png)$/i.test(url)) {
                    return false;
                }
                return url;
            },
            getAllPic: function (sel, $w, editor) {
                var me = this,
                    arr = [],
                    $imgs = $(sel, $w);

                $.each($imgs, function (index, node) {
                    $(node).removeAttr("width").removeAttr("height");

                    //                if (node.width > editor.options.initialFrameWidth) {
                    //                    me.scale(node, editor.options.initialFrameWidth -
                    //                        parseInt($(editor.body).css("padding-left"))  -
                    //                        parseInt($(editor.body).css("padding-right")));
                    //                }

                    return arr.push({
                        _src: node.src,
                        src: node.src,
                    });
                });

                return arr;
            },
            scale: function (img, max, oWidth, oHeight) {
                var width = 0,
                    height = 0,
                    percent,
                    ow = img.width || oWidth,
                    oh = img.height || oHeight;
                if (ow > max || oh > max) {
                    if (ow >= oh) {
                        if ((width = ow - max)) {
                            percent = (width / ow).toFixed(2);
                            img.height = oh - oh * percent;
                            img.width = max;
                        }
                    } else {
                        if ((height = oh - max)) {
                            percent = (height / oh).toFixed(2);
                            img.width = ow - ow * percent;
                            img.height = max;
                        }
                    }
                }

                return this;
            },
            close: function ($img) {
                $img.css({
                    top: ($img.parent().height() - $img.height()) / 2,
                    left: ($img.parent().width() - $img.width()) / 2,
                })
                    .prev()
                    .on("click", function () {
                        if ($(this).parent().remove().hasClass("edui-image-upload-item")) {
                            //显示图片计数-1
                            Upload.showCount--;
                            Upload.updateView();
                        }
                    });

                return this;
            },
            createImgBase64: function (img, file, $w) {
                if (browser.webkit) {
                    //Chrome8+
                    img.src = window.webkitURL.createObjectURL(file);
                } else if (browser.gecko) {
                    //FF4+
                    img.src = window.URL.createObjectURL(file);
                } else {
                    //实例化file reader对象
                    var reader = new FileReader();
                    reader.onload = function (e) {
                        img.src = this.result;
                        $w.append(img);
                    };
                    reader.readAsDataURL(file);
                }
            },
            callback: function (editor, $w, url, state) {
                if (state == "SUCCESS") {
                    //显示图片计数+1
                    Upload.showCount++;
                    var $img = $("<img src='" + editor.options.imagePath + url + "' class='edui-image-pic' />"),
                        $item = $("<div class='edui-image-item edui-image-upload-item'><div class='edui-image-close'></div></div>").append($img);

                    if ($(".edui-image-upload2", $w).length < 1) {
                        $(".edui-image-content", $w).append($item);

                        Upload.render(".edui-image-content", 2).config(".edui-image-upload2");
                    } else {
                        $(".edui-image-upload2", $w).before($item).show();
                    }

                    $img.on("load", function () {
                        Base.scale(this, 120);
                        Base.close($(this));
                        $(".edui-image-content", $w).focus();
                    });
                } else {
                    currentDialog.showTip(state);
                    window.setTimeout(function () {
                        currentDialog.hideTip();
                    }, 3000);
                }

                Upload.toggleMask();
            },
        };

    /*
     * 本地上传
     * */
    var Upload = {
        showCount: 0,
        uploadTpl:
            '<div class="edui-image-upload%%">' +
            '<span class="edui-image-icon"></span>' +
            '<form class="edui-image-form" method="post" enctype="multipart/form-data" target="up">' +
            '<input style="filter: alpha(opacity=0);" class="edui-image-file" type="file" hidefocus name="upfile" accept="image/gif,image/jpeg,image/png,image/jpg,image/bmp"/>' +
            "</form>" +
            "</div>",
        init: function (editor, $w) {
            var me = this;

            me.editor = editor;
            me.dialog = $w;
            me.render(".edui-image-local", 1);
            me.config(".edui-image-upload1");
            me.submit();
            me.drag();

            $(".edui-image-upload1").hover(function () {
                $(".edui-image-icon", this).toggleClass("hover");
            });

            if (!(UM.browser.ie && UM.browser.version <= 9)) {
                $(".edui-image-dragTip", me.dialog).css("display", "block");
            }

            return me;
        },
        render: function (sel, t) {
            var me = this;

            $(sel, me.dialog).append($(me.uploadTpl.replace(/%%/g, t)));

            return me;
        },
        config: function (sel) {
            var me = this,
                url = me.editor.options.imageUrl;

            url = url + (url.indexOf("?") == -1 ? "?" : "&") + "editorid=" + me.editor.id; //初始form提交地址;

            $("form", $(sel, me.dialog)).attr("action", url);

            return me;
        },
        uploadComplete: function (r) {
            var me = this;
            try {
                var json = eval("(" + r + ")");
                Base.callback(me.editor, me.dialog, json.url, json.state);
            } catch (e) {
                var lang = me.editor.getLang("image");
                Base.callback(me.editor, me.dialog, "", (lang && lang.uploadError) || "Error!");
            }
        },
        submit: function (callback) {
            var me = this,
                input = $(
                    '<input style="filter: alpha(opacity=0);" class="edui-image-file" type="file" hidefocus="" name="upfile" accept="image/gif,image/jpeg,image/png,image/jpg,image/bmp">'
                ),
                input = input[0];

            $(me.dialog).delegate(".edui-image-file", "change", function (e) {
                if (!this.parentNode) {
                    return;
                }

                $('<iframe name="up"  style="display: none"></iframe>')
                    .insertBefore(me.dialog)
                    .on("load", function () {
                        var r = this.contentWindow.document.body.innerHTML;
                        if (r == "") return;
                        me.uploadComplete(r);
                        $(this).unbind("load");
                        $(this).remove();
                    });

                $(this).parent()[0].submit();
                Upload.updateInput(input);
                me.toggleMask("Loading....");
                callback && callback();
            });

            return me;
        },
        //更新input
        updateInput: function (inputField) {
            $(".edui-image-file", this.dialog).each(function (index, ele) {
                ele.parentNode.replaceChild(inputField.cloneNode(true), ele);
            });
        },
        //更新上传框
        updateView: function () {
            if (Upload.showCount !== 0) {
                return;
            }

            $(".edui-image-upload2", this.dialog).hide();
            $(".edui-image-dragTip", this.dialog).show();
            $(".edui-image-upload1", this.dialog).show();
        },
        drag: function () {
            var me = this;
            //做拽上传的支持
            if (!UM.browser.ie9below) {
                me.dialog
                    .find(".edui-image-content")
                    .on("drop", function (e) {
                        //获取文件列表
                        var fileList = e.originalEvent.dataTransfer.files;
                        var img = document.createElement("img");
                        var hasImg = false;
                        $.each(fileList, function (i, f) {
                            if (/^image/.test(f.type)) {
                                //创建图片的base64
                                Base.createImgBase64(img, f, me.dialog);

                                var xhr = new XMLHttpRequest();
                                xhr.open("post", me.editor.getOpt("imageUrl") + "?type=ajax", true);
                                xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");

                                //模拟数据
                                var fd = new FormData();
                                fd.append(me.editor.getOpt("imageFieldName"), f);

                                xhr.send(fd);
                                xhr.addEventListener("load", function (e) {
                                    var r = e.target.response,
                                        json;
                                    me.uploadComplete(r);
                                    if (i == fileList.length - 1) {
                                        $(img).remove();
                                    }
                                });
                                hasImg = true;
                            }
                        });
                        if (hasImg) {
                            e.preventDefault();
                            me.toggleMask("Loading....");
                        }
                    })
                    .on("dragover", function (e) {
                        e.preventDefault();
                    });
            }
        },
        toggleMask: function (html) {
            var me = this;

            var $mask = $(".edui-image-mask", me.dialog);
            if (html) {
                if (!(UM.browser.ie && UM.browser.version <= 9)) {
                    $(".edui-image-dragTip", me.dialog).css("display", "none");
                }
                $(".edui-image-upload1", me.dialog).css("display", "none");
                $mask.addClass("edui-active").html(html);
            } else {
                $mask.removeClass("edui-active").html();

                if (Upload.showCount > 0) {
                    return me;
                }

                if (!(UM.browser.ie && UM.browser.version <= 9)) {
                    $(".edui-image-dragTip", me.dialog).css("display", "block");
                }
                $(".edui-image-upload1", me.dialog).css("display", "block");
            }

            return me;
        },
    };

    /*
     * 网络图片
     * */
    var NetWork = {
        init: function (editor, $w) {
            var me = this;

            me.editor = editor;
            me.dialog = $w;

            me.initEvt();
        },
        initEvt: function () {
            var me = this,
                url,
                $ele = $(".edui-image-searchTxt", me.dialog);

            $(".edui-image-searchAdd", me.dialog)
                .on("click", function () {
                    url = Base.checkURL($ele.val());

                    if (url) {
                        $("<img src='" + url + "' class='edui-image-pic' />").on("load", function () {
                            var $item = $("<div class='edui-image-item'><div class='edui-image-close'></div></div>").append(this);

                            $(".edui-image-searchRes", me.dialog).append($item);

                            Base.scale(this, 120);

                            $item.width($(this).width());

                            Base.close($(this));

                            $ele.val("");
                        });
                    }
                })
                .hover(function () {
                    $(this).toggleClass("hover");
                });
        },
    };

    var $tab = null,
        currentDialog = null;

    UM.registerWidget(
        "image",
        {
            tpl:
                '<link rel="stylesheet" type="text/css" href="<%=image_url%>image.css">' +
                '<div class="edui-image-wrapper">' +
                '<ul class="edui-tab-nav">' +
                '<li class="edui-tab-item edui-active"><a data-context=".edui-image-local" class="edui-tab-text"><%=lang_tab_local%></a></li>' +
                '<li  class="edui-tab-item"><a data-context=".edui-image-JimgSearch" class="edui-tab-text"><%=lang_tab_imgSearch%></a></li>' +
                "</ul>" +
                '<div class="edui-tab-content">' +
                '<div class="edui-image-local edui-tab-pane edui-active">' +
                '<div class="edui-image-content"></div>' +
                '<div class="edui-image-mask"></div>' +
                '<div class="edui-image-dragTip"><%=lang_input_dragTip%></div>' +
                "</div>" +
                '<div class="edui-image-JimgSearch edui-tab-pane">' +
                '<div class="edui-image-searchBar">' +
                '<table><tr><td><input class="edui-image-searchTxt" type="text"></td>' +
                '<td><div class="edui-image-searchAdd"><%=lang_btn_add%></div></td></tr></table>' +
                "</div>" +
                '<div class="edui-image-searchRes"></div>' +
                "</div>" +
                "</div>" +
                "</div>",
            initContent: function (editor, $dialog) {
                var lang = editor.getLang("image")["static"],
                    opt = $.extend({}, lang, {
                        image_url: UMEDITOR_CONFIG.UMEDITOR_HOME_URL + "dialogs/image/",
                    });

                Upload.showCount = 0;

                if (lang) {
                    var html = $.parseTmpl(this.tpl, opt);
                }

                currentDialog = $dialog.edui();

                this.root().html(html);
            },
            initEvent: function (editor, $w) {
                $tab = $.eduitab({ selector: ".edui-image-wrapper" })
                    .edui()
                    .on("beforeshow", function (e) {
                        e.stopPropagation();
                    });

                Upload.init(editor, $w);

                NetWork.init(editor, $w);
            },
            buttons: {
                ok: {
                    exec: function (editor, $w) {
                        var sel = "",
                            index = $tab.activate();

                        if (index == 0) {
                            sel = ".edui-image-content .edui-image-pic";
                        } else if (index == 1) {
                            sel = ".edui-image-searchRes .edui-image-pic";
                        }

                        var list = Base.getAllPic(sel, $w, editor);

                        if (index != -1) {
                            editor.execCommand("insertimage", list);
                        }
                    },
                },
                cancel: {},
            },
            width: 700,
            height: 408,
        },
        function (editor, $w, url, state) {
            Base.callback(editor, $w, url, state);
        }
    );
})();
